import { Injectable, UnauthorizedException } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { JwtUtil } from './jwt.util';
import { AuthConfig } from './auth.config';

@Injectable()
export class AuthService {
  constructor(private readonly jwtService: JwtService) {}

  /**
   * 生成访问令牌
   * @param payload 载荷数据
   * @returns JWT令牌
   */
  async generateToken(payload: any): Promise<string> {
    // 使用NestJS的JwtService
    return this.jwtService.sign(payload, {
      expiresIn: AuthConfig.expiresIn
    });
  }
  
  /**
   * 生成刷新令牌
   * @param payload 载荷数据
   * @returns 刷新令牌
   */
  async generateRefreshToken(payload: any): Promise<string> {
    // 添加令牌类型标识
    const refreshPayload = {
      ...payload,
      tokenType: 'refresh'
    };
    
    return this.jwtService.sign(refreshPayload, {
      expiresIn: AuthConfig.refreshExpiresIn
    });
  }
  
  /**
   * 使用刷新令牌生成新的访问令牌
   * @param refreshToken 刷新令牌
   * @returns 新的访问令牌
   */
  async refreshAccessToken(refreshToken: string): Promise<string> {
    try {
      // 验证刷新令牌
      const payload = await this.jwtService.verifyAsync(refreshToken);
      
      // 检查是否是刷新令牌
      if (payload.tokenType !== 'refresh') {
        throw new UnauthorizedException('无效的刷新令牌');
      }
      
      // 移除令牌类型，创建新的访问令牌
      const { tokenType, exp, iat, ...userData } = payload;
      
      // 生成新的访问令牌
      return this.generateToken(userData);
    } catch (error) {
      throw new UnauthorizedException('刷新令牌已过期或无效');
    }
  }

  /**
   * 验证token
   * @param token JWT令牌
   * @returns 解析后的payload或null
   */
  async validateToken(token: string): Promise<any> {
    try {
      // 使用NestJS的JwtService
      return await this.jwtService.verifyAsync(token);
      
      // 或者使用我们的JwtUtil
      // return JwtUtil.verifyToken(token);
    } catch (error) {
      return null;
    }
  }
  
  /**
   * 解码token（不验证签名）
   * @param token JWT令牌
   * @returns 解码后的payload
   */
  decodeToken(token: string): any {
    // 使用NestJS的JwtService
    return this.jwtService.decode(token);
    
    // 或者使用我们的JwtUtil
    // return JwtUtil.decodeToken(token);
  }
}